/*
@Author   : Uyynot
@Email    : uyynot@qq.com
@Time     : 2024/1/12 16:09
@File     : helpers.go
@Project  : gohub
@Desc     :
*/
package helpers

import (
	"fmt"
	"math"
	"math/rand"
	"reflect"
	"strconv"
	"time"
)

func Empty(val any) bool {
	if val == nil {
		return true
	}
	v := reflect.ValueOf(val)
	switch v.Kind() {
	case reflect.String, reflect.Array:
		return v.Len() == 0
	case reflect.Map, reflect.Slice:
		return v.Len() == 0 || v.IsNil()
	case reflect.Bool:
		return !v.Bool()
	case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
		return v.Int() == 0
	case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
		return v.Uint() == 0
	case reflect.Float32, reflect.Float64:
		return v.Float() == 0
	case reflect.Interface, reflect.Ptr:
		return v.IsNil()

	}
	return reflect.DeepEqual(val, reflect.Zero(v.Type()).Interface())
}

// MicrosecondsStr 将time.Duration类型(nano sconds 为单位) 输出位小数点后3位的ms(microsecond 毫秒，千分之一秒)
func MicrosecondsStr(elapsed time.Duration) string {
	return fmt.Sprintf("%.3fms", float64(elapsed.Nanoseconds())/1e6)
}

// RandomNumber 生成长度为length的随机数字字符串("crypto/rand")
//
//	func RandomNumber(length int) string {
//		table := [...]byte{'1', '2', '3', '4', '5', '6', '7', '8', '9', '0'}
//		b := make([]byte, length)
//		//向b中填充随机数
//		n, err := io.ReadAtLeast(rand.Reader, b, length)
//
//		if n != length {
//			panic(err)
//		}
//		for i := 0; i < len(b); i++ {
//			b[i] = table[int(b[i])%len(table)]
//		}
//		return string(b)
//	}
//
// RandomNumber 生成长度为length的随机数字字符串(math.rand)[方式有很多种]
func RandomNumber(length int) string {
	if length < 1 {
		panic("长度不能小于1")
	}
	//获取length长度最大最小数如：length=3则min=100，max=999
	min, max := math.Pow(10, float64(length-1)), math.Pow(10, float64(length))-1
	return RandomInt(min, max)
}

// RandomInt 生成min到max之间的数字
func RandomInt(min, max float64) string {
	if min >= max {
		panic("min必须小于max")
	}
	//获取0到max的随机数
	value := max * rand.Float64()
	//如果随机数小于min，则在随机数基础上再加上min
	if value < min {
		value += min
	}
	//float转string(保留0位小数)
	return strconv.FormatFloat(value, 'f', 0, 64)

}

// FirstElement
// @Description: 安全地获取 args[0]，避免 panic: runtime error: index out of range
// @param args
// @return string
func FirstElement(args []string) string {
	if len(args) > 0 {
		return args[0]
	}
	return ""
}

// RandomString
// @Description: 生成长度为 length 的随机字符串
// @param length
// @return string
func RandomString(length int) string {
	rand.Seed(time.Now().UnixNano())
	letters := "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
	b := make([]byte, length)
	for i := range b {
		b[i] = letters[rand.Intn(len(letters))]
	}
	return string(b)
}
